<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<script>
    /*
    async是一个加在函数前的修饰符，被async定义的函数会默认返回一个Promise对象resolve的值。

    因此对async函数可以直接then，返回值就是then方法传入的函数。*/

    // async function calc(a,b) {
    //     console.log(a+b)
    // }
    //
    // calc(5,10).then(p=>{
    //     console.log('Hello')
    // })

    /* await 也是一个修饰符，只能放在async定义的函数内。可以理解为等待。

        await 修饰的如果是Promise对象：可以获取Promise中返回的内容（resolve或reject的参数），且取到值后语句才会往下执行；

        如果不是Promise对象：把这个非promise的东西当做await表达式的结果。*/

    // async function fun() {
    //     let a = await 1;
    //     let b = await new Promise((resolve, reject) => {
    //         setTimeout(function () {
    //             resolve('setTimeout')
    //         }, 3000)
    //     })
    //     let c = await function () {
    //         return 'function'
    //     }()
    //     console.log(a, b, c)
    // }
    //
    // fun(); // 3秒后输出： 1 "setTimeout" "function"

    // 正确使用方式
    function getSomeThing() {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('获取成功 A ')
            }, 3000)
        })
    }

    function getSomeThin() {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('获取成功 B ')
            }, 2000)
        })
    }

    function log(time) {
        setTimeout(function () {
            console.log(time);
            return 1;
        }, time)
    }

    const fun = async () => {
        let a = await getSomeThing();
        console.log(a)
        let b = await getSomeThin();
        console.log(b);
        let c = log(1000);
    }
    fun();

</script>
</body>
</html>
